﻿using MySql.Data.MySqlClient;
using SDE_FIC.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Web;

namespace SDE_FIC.DAO
{
    public class FrequenciaDAO
    {
        private DBConnect _db;

        public FrequenciaDAO(ref DBConnect db)
        {
            this._db = db;

        }

        /// <summary>
        /// Prefixo da consulta padrão SQL
        /// </summary>
        /// <returns></returns>
        private StringBuilder GetPrefix()
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("SELECT ");
            sb.AppendLine("  `idfrequencia`,");
            sb.AppendLine("  `data`,");
            sb.AppendLine("  `horaaula`,");
            sb.AppendLine("  `presenca`,");
            sb.AppendLine("  `matricula_idmatricula`");
            sb.AppendLine("FROM ");
            sb.AppendLine("  `frequencia` f");

            return sb;
        }

        private Frequencia LoadObject(ref DataRow row)
        {
            Frequencia _frequencia = new Frequencia();

            //MatriculaDAO matriculaDAO = new MatriculaDAO(ref _db);

            _frequencia.IdFrequencia = (int)row["idfrequencia"];
            _frequencia.Data = (DateTime)row["data"];
            _frequencia.HoraAula = (int)row["horaaula"];
            _frequencia.Presenca = (string)row["presenca"];
            //_frequencia.Matricula = matriculaDAO.LoadBy((int)row["matricula_idmatricula"]);
            return _frequencia;

        }

        /// <summary>
        /// Consulta lista de frequencia atraves de consulta de diario. Caso nao existe diario, retorna lista de matriculas sem frequencia
        /// </summary>
        /// <param name="_diario"></param>
        /// <param name="_data"></param>
        /// <param name="_unidadeCurricular"></param>
        /// <returns></returns>
        public List<Frequencia> LoadByDiario(Diario _diario, DateTime _data, UnidadeCurricular _unidadeCurricular)
        {
            List<Frequencia> lFrequencia = new List<Frequencia>();

            StringBuilder sbSQL = GetPrefix();

            return lFrequencia;

        }

        public List<Frequencia> LoadByTurma(ref Turma _turma)
        {
            List<Frequencia> lFrequencia = new List<Frequencia>();

            StringBuilder sb = new StringBuilder();

            sb.AppendLine("SELECT ");
            sb.AppendLine("  `idmatricula`,");
            sb.AppendLine("  `datamatricula`,");
            sb.AppendLine("  `situacao`,");
            sb.AppendLine("  `datasituacao`,");
            sb.AppendLine("  `aluno_idaluno`,");
            sb.AppendLine("  `turma_idturma`");
            sb.AppendLine("FROM ");
            sb.AppendLine("  `matricula` m");
            sb.AppendLine("WHERE ");
            sb.AppendLine("	m.`turma_idturma` = @turma_idturma    ");

            MySqlCommand myCmd = new MySqlCommand();
            myCmd.Connection = _db.Connection;
            myCmd.CommandText = sb.ToString();
            myCmd.Parameters.Add("@turma_idturma", MySqlDbType.Int16, 0).Value = _turma.Idturma;

            DataTable _dt = _db.ExecuteQuery(ref myCmd);

            MatriculaDAO matriculaDAO = new MatriculaDAO(ref _db);

            for (int i = 0; i < _dt.Rows.Count; i++)
            {
                DataRow dr = _dt.Rows[i];

                Frequencia _f = new Frequencia();
                _f.Matricula = matriculaDAO.LoadById(Convert.ToInt16(dr["idmatricula"]));

                lFrequencia.Add(_f);

            }

            return lFrequencia;

        }

        public Frequencia LoadById(int Id)
        {
            Frequencia _frequencia = new Frequencia();

            StringBuilder sbSQL = GetPrefix();
            sbSQL.AppendLine("WHERE idfrequencia = @idfrequencia ");

            MySqlCommand mySQL = new MySqlCommand();
            mySQL.CommandText = sbSQL.ToString();
            mySQL.Connection = _db.Connection;
            mySQL.Parameters.Add("@idfrequencia", MySql.Data.MySqlClient.MySqlDbType.Int16, 0).Value = Id;

            DataTable dt = _db.ExecuteQuery(ref mySQL);

            if (dt.Rows.Count == 1)
            {

                DataRow dr = dt.Rows[0];

                LoadObject(ref dr);

            }

            return _frequencia;

        }

        public void Insert(ref Frequencia _frequencia, long idDiario)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine("INSERT INTO ");
            sb.AppendLine("  `frequencia`");
            sb.AppendLine("(");
            sb.AppendLine("  `data`,");
            sb.AppendLine("  `horaaula`,");
            sb.AppendLine("  `presenca`,");
            sb.AppendLine("  `matricula_idmatricula`,");
            sb.AppendLine("  `diario_iddiario`) ");
            sb.AppendLine("VALUE (");
            sb.AppendLine("  :data,");
            sb.AppendLine("  :horaaula,");
            sb.AppendLine("  :presenca,");
            sb.AppendLine("  :matricula_idmatricula,");
            sb.AppendLine("  :diario_iddiario);");

            MySqlCommand myCMD = new MySqlCommand();
            myCMD.CommandText = sb.ToString();
            myCMD.Transaction = _db.Transaction;
            myCMD.Parameters.Add("@data", MySqlDbType.Date, 0).Value = _frequencia.Data;
            myCMD.Parameters.Add("@horaaula", MySqlDbType.Date, 0).Value = _frequencia.HoraAula;
            myCMD.Parameters.Add("@presenca", MySqlDbType.VarChar, 1).Value = _frequencia.Presenca;
            myCMD.Parameters.Add("@matricula_idmatricula", MySqlDbType.Int16, 0).Value = _frequencia.Matricula.IdMatricula ;
            myCMD.Parameters.Add("@diario_iddiario", MySqlDbType.Int16, 0).Value = idDiario;

            myCMD.ExecuteNonQuery();

            _frequencia.IdFrequencia = myCMD.LastInsertedId;

        }
    }
}